在講Hoisting之前,要先解釋一下undefined
與 is not defined
的差異:
undefined
: 是指「已宣告未賦值」的變數或函數。
var a;
console.log(a) //undefined
is not defined
: 是指「未宣告」的意思。
console.log(b) // ReferenceError: b is not defined
而Hoisting的觀念是,不管變數、函式宣告的位置在哪裡,JavaScript在一開始載入時都會先找到所有「變數」與「函式 function」,並放入記憶體空間內。
先看以下範例:
var a = '宣告變數';
function b() {
console.log('宣告函式');
}
console.log(a); //宣告變數
b(); //宣告函式
以上a、b都是預期中的結果。
那如果按照Hoisting的特性,下面的程式執行的結果會是什麼呢?
console.log(a);
b();
var a = '宣告變數';
function b() {
console.log('宣告函式');
}
結果:
console.log(a); //undefined
b(); //宣告函式
函式b有成功執行出'宣告函式' ; 而變數a的執行結果卻是"undefined",為什麼呢?
這是因為Hoisting的重要特性: 變數僅提升宣告的部分,而不會提升賦值。
也就是說,函式在宣告時就會完整放在記憶體空間裡,而變數就只是宣告但不會賦值。